/** 通用函数库 */
const common = {

    /** 旋转一个向量 */
    vectorRotate({x, y}, rad, { x: baseX, y: baseY } = { x: 0, y: 0 }) {
        const { sin, cos } = Math;

        // 向量旋转公式
        return {
            x: cos(rad) * x - sin(rad) * y + baseX,
            y: sin(rad) * x + cos(rad) * y + baseY
        }
    },

    /** 将角度转为弧度 */
    toRad(deg) {
        return (deg / 180) * Math.PI;
    },

    /** 获取从 p1 到 p2 的向量 */
    getVector(p1, p2) {
        return {
            x: p2.x - p1.x,
            y: p2.y - p1.y
        };
    },

    /** 获取从 base 到 vectorArr 中的每个点的向量数组  */
    vectorMap(base, vectorArr) {
        return vectorArr.map(function (vector) {
            return common.getVector(base, vector);
        });
    },

    /** 将 points 中的点投影到 dirVector 为方向的轴上 */
    projection(dirVector, points) {
        const { x: dirX, y: dirY } = dirVector,
            // 方向向量的模
            dirVectorMode = Math.sqrt(dirX * dirX + dirY * dirY);

        return points.map((v) => {
            // 向量投影公式
            return (v.x * dirX + v.y * dirY) / dirVectorMode;
        });
    },

    /** 比较两个范围是否重叠 */
    rangeOverlap(range1, range2) {
        const { min, max } = Math;
        const min1 = min(...range1), max1 = max(...range1),
            min2 = min(...range2), max2 = max(...range2);
        return min2 <= max1 && max2 >= min1;
    }
}